home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1999 …ember: Reference Library / Apple Developer Reference Library (December 1999) (Disk 1).iso / pc / technical documentation / develop / develop issue 28 / develop issue 28 code / sketch / source / appleevent / aermiscsuite.c < prev    next >
Encoding:
C/C++ Source or Header  |  1996-08-11  |  6.0 KB  |  256 lines

  1. /****************************************************************************
  2.  * 
  3.  * AERMiscSuite.c
  4.  * 
  5.  * Apple Event Registry (AER) Miscellaneou Suite support
  6.  *
  7.  ****************************************************************************/
  8.  
  9. #include "AERMiscSuite.h"
  10. #include "AppleEvent.h"
  11.  
  12. #include "OSASupport.h"
  13.  
  14. #include "Structs.h"
  15. #include "DocumentADT.h"
  16.  
  17. #include "Sounds.h"                // for Play Sound and Say events
  18. #include "StringUtils.h"
  19.  
  20. #include "OSLHelpers.h"
  21.  
  22. // ---------------------------------------------------------------------------
  23. //                            Private Interface
  24. // ---------------------------------------------------------------------------
  25.  
  26. static pascal OSErr     HandleDoScript            (AppleEvent *appleEvent, AppleEvent *reply, long refCon);
  27. static pascal OSErr     HandleAEPlaySound        (AppleEvent *appleEvent, AppleEvent *reply, long refCon);
  28. static pascal OSErr     HandleAESayText        (AppleEvent *appleEvent, AppleEvent *reply, long refCon);
  29.  
  30. /*****************************************************************************
  31.  * 
  32.  * InstallMiscSuiteHandlers
  33.  * 
  34.  * Called by InstallAEHandlers() at program initialization time
  35.  * 
  36.  *****************************************************************************/
  37.  
  38. Boolean 
  39. InstallMiscSuiteHandlers(void)
  40. {
  41.     Boolean error;
  42.     
  43.     // Do Script
  44.  
  45.     error = AEInstallEventHandler(    kAEMiscStandards, 
  46.                                                 kAEDoScript,    
  47.                                                 NewAEEventHandlerProc(HandleDoScript), 
  48.                                                 0, 
  49.                                                 false);
  50.         
  51.     // Play Sound
  52.     
  53.     if (error == noErr)
  54.         error = AEInstallEventHandler(kCoreEventClass, 
  55.                                                 kAEPlaySound,    
  56.                                                 NewAEEventHandlerProc(HandleAEPlaySound), 
  57.                                                 0, 
  58.                                                 false);
  59.     
  60.     // Say
  61.     
  62.     if (error == noErr)
  63.         error = AEInstallEventHandler(kCoreEventClass, 
  64.                                                 kAESay,    
  65.                                                 NewAEEventHandlerProc(HandleAESayText), 
  66.                                                 0, 
  67.                                                 false);
  68.     
  69.     return (error == noErr);
  70. }
  71.  
  72.  
  73. /*****************************************************************************
  74.  * 
  75.  * HandleDoScript
  76.  * 
  77.  * AppleEvent processing to receive an AppleScript & run it
  78.  * The direct parameter can be either typeIntlText or typeAlias
  79.  *
  80.  *****************************************************************************/
  81.  
  82. static pascal OSErr 
  83. HandleDoScript(AppleEvent *appleEvent, AppleEvent *reply, long refCon)
  84. {
  85.     #pragma unused        (refCon)
  86.  
  87.     OSErr            error         = noErr;
  88.     AEDesc      directObj    = {typeNull, nil};
  89.     AEDesc      script         = {typeNull, nil};
  90.  
  91.     error = AEGetParamDesc(appleEvent, keyDirectObject, typeWildCard, &directObj);
  92.     if (error != noErr)
  93.         goto CleanUp;
  94.         
  95.     switch (directObj.descriptorType)
  96.     {
  97.         case typeObjectSpecifier:
  98.         case typeFSS:
  99.         case typeAlias:
  100.             error = AECoerceDesc(&directObj, typeFSS, &script);
  101.             if (error == noErr)
  102.             {
  103.                 FSSpec     fsSpec         = **(FSSpecHandle)(script.dataHandle);
  104.                 FInfo        fInfo;
  105.                 OSAID     scriptID     = 0L;
  106.         
  107.                 // make sure the file is a compiled AppleScript file
  108.                 
  109.                 error = FSpGetFInfo(&fsSpec, &fInfo);
  110.                 if (error != noErr)
  111.                     goto CleanUp;
  112.                     
  113.                 switch(fInfo.fdType)
  114.                 {
  115.                     case kOSAFileType:                                                // a compiled script file
  116.                         error = LoadCompiledScript(&fsSpec, &scriptID);
  117.                         if (error == noErr)
  118.                             error =     ExecuteScript(scriptID);
  119.                         break;
  120.                         
  121.                     default:
  122.                         error = errAEWrongDataType;
  123.                         break;
  124.                 }
  125.                 
  126.             }
  127.             break;
  128.             
  129.         default:
  130.             error = errAEWrongDataType;
  131.             break;
  132.     }
  133.  
  134. CleanUp:
  135.     AEDisposeDesc(&directObj);
  136.     AEDisposeDesc(&script);
  137.     
  138.     if (reply != NULL && error != noErr)
  139.         AEPutParamPtr(reply, keyErrorNumber, typeLongInteger, (Ptr)&error, sizeof(OSErr));    
  140.  
  141.     return error;
  142. }
  143.  
  144. /*****************************************************************************
  145.  * 
  146.  * HandleAEPlaySound
  147.  * 
  148.  *****************************************************************************/
  149.  
  150. static pascal OSErr 
  151. HandleAEPlaySound(AppleEvent *appleEvent, AppleEvent *reply, long refCon)
  152. {
  153.     #pragma unused        (refCon)
  154.  
  155.     OSErr        error;
  156.     
  157.     AEDesc   directObject    = {typeNull, nil};
  158.  
  159.     short    soundResID;
  160.     long        aLong;
  161.     
  162.     // The (required) parameter: 'snd ' resource ID
  163.     
  164.     error = AEGetParamDesc(appleEvent, keyDirectObject, typeWildCard, &directObject);
  165.     if (error != noErr)
  166.         goto CleanUp;
  167.  
  168.     switch (directObject.descriptorType)
  169.     {
  170.         case typeLongInteger:
  171.             error = DescToLong(&directObject, &aLong);
  172.             PlaySound((short)aLong);
  173.             break;
  174.         
  175.         case typeShortInteger:
  176.             error = DescToShort(&directObject, &soundResID);
  177.             if (error == noErr)
  178.             {
  179.                 PlaySound(soundResID);
  180.             }
  181.  
  182.         default:
  183.             error = errAEEventNotHandled;
  184.     }
  185.     
  186. CleanUp:
  187.     AEDisposeDesc(&directObject);
  188.     
  189.     if (reply != NULL && reply->descriptorType != typeNull && error != noErr)
  190.         AEPutParamPtr(reply, keyErrorNumber, typeLongInteger, (Ptr)&error, sizeof(OSErr));    
  191.  
  192.     return error;
  193. }
  194.  
  195.  
  196. /*****************************************************************************
  197.  * 
  198.  * HandleAESayText
  199.  * 
  200.  *****************************************************************************/
  201.  
  202. #define VOICE_BUFFER_SIZE 40
  203.  
  204. static pascal OSErr 
  205. HandleAESayText(AppleEvent *appleEvent, AppleEvent *reply, long refCon)
  206. {
  207.     #pragma unused        (refCon)
  208.  
  209.     OSErr        error;
  210.  
  211.     AEDesc   directObject    = {typeNull, nil};
  212.     AEDesc   voiceParam     = {typeNull, nil};
  213.  
  214.     char     voice[VOICE_BUFFER_SIZE];
  215.     char    *voicePtr = voice;
  216.     
  217.     // The (required) string to speak:
  218.     
  219.     error = AEGetParamDesc(appleEvent, keyDirectObject, typeChar, &directObject);
  220.     if (error != noErr)
  221.         goto CleanUp;
  222.  
  223.     // The (optional) voice name:
  224.     
  225.     error = AEGetParamDesc(appleEvent, 'VOIC', typeChar, &voiceParam);
  226.     if (error != noErr)
  227.     {
  228.         voicePtr = NULL;
  229.         error    = noErr;    // Disregard error because the voice parameter is optional
  230.     }
  231.     else
  232.     {
  233.         TextToCString(voiceParam.dataHandle, voice, VOICE_BUFFER_SIZE);
  234.     }
  235.     
  236.     // Speech!
  237.     
  238.     if (directObject.dataHandle != nil)
  239.     {
  240.         SayHandle(voicePtr, directObject.dataHandle);
  241.     }
  242.  
  243. CleanUp:
  244.  
  245.     AEDisposeDesc(&directObject);
  246.     AEDisposeDesc(&voiceParam);
  247.     
  248.     if (reply != NULL && reply->descriptorType != typeNull && error != noErr)
  249.         AEPutParamPtr(reply, keyErrorNumber, typeLongInteger, (Ptr)&error, sizeof(OSErr));    
  250.     
  251.     return error;
  252. }
  253.  
  254.  
  255. // ---------------------------------------------------------------------------
  256.